PCI and PCIe are computer expansion bus standards. PCI and PCIe are defined in various standards associated with the PCI-SIG (available online at www.pcisig.com/specifications/). As described herein, reference to PCI and/or PCIe means PCI, PCIe, and variants thereof. There are two reported methods of PCI device configurations supported in the existing operating systems (OSs) such as Linux and VxWorks: (1) PCI devices are plugged and powered before booting operating systems (referred to as a cold plug), and (2) PCI devices are plugged and powered after operating systems booting (referred to as a hot plug). For the cold plug, PCI devices are plugged in and powered before booting the operating systems. With this approach, before starting PCI enumeration during OS booting, the PCI devices must meet the following requirements: must be electrically connected to the system (i.e. plugged, and powered on), must have all required clocks, and must be out of reset. Furthermore, the exiting Linux PCI rescan/re-enumeration is only effective for PCI devices that have been enumerated during OS PCI subsystem's first PCI enumeration.
For the hot plug, PCI devices are plugged and powered after booting the operating systems. This hot plug approach was introduced to enable higher availability of the systems of removing and installing PCI add-in cards while the system is running For this hot plug approach, before starting PCI enumeration during OS booting, the PCI devices must meet the following requirements: must not be electrically connected to the system (i.e. not plugged, not powered on), must not have any required clocks, and must be in reset. When using this hot plug approach, PCI hot plug controller hardware is required to detect whether a new PCI device is plugged in and is ready to use. The hot plug controllers inform a hot plug controller module for handling the discovery and resource management of the newly-powered PCI devices. This approach is explained in detail in “PCI Express Hot-Plug Mechanism in Linux-based ADCA Control Systems,” the contents of which are incorporated by reference herein, (available online at accnet.web.cern.ch/accnet/Literature/2010/RFTECH_Presentation_Piotrowski_Adam.pdf). The full PCI enumeration mentioned herein is the process of assigning resources to all the PCI controllers on a given PCI host bridge. This process includes the following: discovering the accessible PCI devices, assigning PCI bus numbers and PCI interrupts, allocating PCI Input/Output (I/O) resources, PCI memory resources, and PCI prefetchable memory resources, and setting miscellaneous PCI Direct Memory Access (DMA) values. The full PCI enumeration is performed only once during the boot process or during reception of a PCI hot plug event. The subsequent enumeration only handles the PCIe devices that have been discovered in the full enumeration.
Disadvantageously, circumstances can arise where one of the two aforementioned approaches (cold plug and hot plug) are unavailable. For example, PCI devices could be physically plugged into (connected to) a PCI Root Complex before booting, but they are not able to be accessed by the OS software. The reason is that these PCI devices need to have a clock configuration and be out of reset to be accessible. Without the clock configuration and reset handling in the bootloader, the current systems and methods cannot handle the cold plug. The clock configuration and reset handling in the bootloader cannot be done since it has serious architectural drawbacks such as writing the clock drivers and complex clock initializing within processor boot. Further, these PCI devices may not have any hot plug controller hardware, which is required if these devices are plugged and powered after the operating system has been booted. Thus, there is a need within PCI, PCIe, and variants thereof for another method of PCI device configuration to overcome the aforementioned constraints.